<?php

/**
 * 线程类
 */
class PHPXiancheng {
    /**
     * 构造函数
     *
     * @param callback $oCallback 线程函数
     */
    public function __construct($oCallback) {
        $this->oCallback = $oCallback;
    }

    /**
     * @var callback 线程函数
     */
    protected $oCallback;
    /**
     * @var integer 虚拟线程的进程ID
     */
    protected $iProcessID = -1;

    /**
     * 立即启动线程
     *
     * @param mixed $oParameter 传递给线程函数的参数
     */
    public function start($oParameter = null) {
        $pid = pcntl_fork();
        if($pid == -1) {
            throw new Exception("Cannot fork");
        } else if($pid) {// parent
            $this->iProcessID = $pid;
            return;
        }

        // child

        // 清空父进程中可能安装的信号处理函数
        pcntl_signal(SIGTERM, SIG_IGN);
        pcntl_signal(SIGUSR1, SIG_IGN);
        pcntl_signal(SIGHUP, SIG_IGN);

        try {
            if($oParameter) {
                call_user_func($this->oCallback, $oParameter);
            } else {
                call_user_func($this->oCallback);
            }
        } catch(Exception $ex) {
            print $ex->getMessage() . "\n";
            exit(1);
        }

        exit(0);
    }

    /**
     * 发送终止信号给虚拟线程
     */
    public function stop() {
        $this->sendSignal(SIGTERM);
    }

    /**
     * 发送指定的信号给虚拟线程
     *
     * @param integer $iSignal 信号
     */
    public function sendSignal($iSignal) {
        if($this->iProcessID != -1) {
            posix_kill($this->iProcessID, $iSignal);
        }
    }

    /**
     * 获取虚拟线程的进程ID
     *
     * @return integer
     */
    public function getProcessID() {
        return $this->iProcessID;
    }
}

?>